#ifndef _GLOBAL_H
#define _GLOBAL_H

/***** include *****/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/sem.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/ioctl.h>

/***** define *****/
/* 信号量 */
#define SEM_NUM                       128 //信号集信号个数
#define sem_msg_queue_qt_id           0//消息队列读写锁
#define sem_msg_fs_led_arraval_id     1//fs_led消息写入通知信号
#define sem_led_handler_id            2//消息接收完毕通知信号
#define sem_uart_write_id             3//通知写线程对串口进行写操作
#define sem_uart_msg_handle_id        4//通知读线程对串口进行读出的数据进行处理
#define sem_ms_zb_led_arraval_id      5//zb_led消息写入
#define sem_uart_rec_dat_wr_id        6//读写锁 操作串口读到的数据
#define sem_sqlite_wr_id              7//数据库操作读写锁
#define sem_send_dev_online_list      8//发送设备在线列表信号量
#define sem_send_dev_cfg_list         9//发送设备配置列表
#define sem_alarm_task_list           10//发送定时任务的消息
#define sem_del_alarm_task            11//删除一个定时任务
#define sem_update_alarm_task         12//更新定时任务链表


/* 消息队列 */
#define MSG_QUEUE_ZB_TYPE             100
#define MSG_QUEUE_WEBSOCKET_TYPE      101
#define MSG_QUEUE_ALARM_TYPE          102
#define MSG_QUEUE_DEL_ALARM_TYPE      103//删除闹钟链表的消息类型
//MSG_QUEUE key
#define QT_MSG_QUEUE_KEY 1234

/* head 表明方向 */

/* zigbee 数据包 zigbee dev */
#define ZIGBEE_PHOTOSENSITIVE_LED_TEMP 0  /* 光敏电阻 - LED */
#define ZIGBEE_FAN_LED_TEMP            1  /* 直流风扇 - LED */

#define ZIGBEE_BEDROOM                 2  /* 卧室 */
#define ZIGBEE_LIVINGROOM              3  /* 客厅 */
#define ZIGBEE_KITCHEN                 4  /* 厨房 */
#define ZIGBEE_BATHROOM                5  /* 浴室 */
/* zigbee 数据包 zigbee dev */

/* cmd type       */
#define ZB_COORD_LOGIN_IN             0 //如果设备为协调器 入网结构的第31位为1
#define CMD_LED_2                     1 //LED2
#define CMD_PSST                      2 //光敏
#define CMD_FAN                       3 //直流风扇
#define CMD_TEMP                      4 //温度传感器

#define CMD_ADDR                      5 //表示zigbee的网络地址
#define CMD_LIGHT                     6 /* 灯光          */
#define CMD_TEMPERATURE               7 /* 温度 DHT11    */
#define CMD_HUMIDITY                  8 /* 湿度 DHT11    */
#define CMD_DOOR                      9 /* 门 舵机       */
#define CMD_RELAY                     10/* 继电器 排气扇 */
#define CMD_BEEP                      11/* 蜂鸣器        */
#define CMD_SMOKE                     12/* 烟雾传感器    */
#define CMD_CALORIFIER                13/* 热水器        */
#define CMD_CURTAIN                   14/* 窗帘          */
#define ZB_NODE_JOIN_NETWORK          15/* 入网          */
#define ZB_NODE_HEART_BEAT_PKG        16/* 心跳包        */
#define ZB_DEV_ONLINE                 17
#define ZB_DEV_OFFLINE                18
#define ZB_SEND_INFO                  19/* 发送入网信息 */



/* cmd type       */

/* CMD_LED        */
#define CMD_LED_ON                    0
#define CMD_LED_OFF                   1

/* CMD_FAN        */
#define CMD_FAN_ON                    0
#define CMD_FAN_OFF                   1

/* CMD_LIGHT      */
#define ZB_LIGHT_ON                   0
#define ZB_LIGHT_OFF                  1

/* CMD_DOOR      */
#define ZB_Engine_Door_Open           1
#define ZB_Engine_Door_Close          0

/* CMD_RELAY     */
#define ZB_RELAY_ON                   0
#define ZB_RELAY_OFF                  1

/* CMD_BEEP     */
#define ZB_BEEP_ON                    1
#define ZB_BEEP_OFF                   0

/* CMD_SMOKE    */
#define ZB_SMOKE_NORMAL               1//正常
#define ZB_SMOKE_ABNORMAL             0//异常

/* CMD_CALORIFIER     */
#define ZB_CALORIFIER_ON              0
#define ZB_CALORIFIER_OFF             1

/* CMD_CURTAIN        */
#define ZB_CURTAIN_ON                 0
#define ZB_CURTAIN_OFF                1


/**** 常量定义 ****/
#define Z_EXTADDR_LEN                 8
#define MAX_SENSOR_COUNT              10


/***** typedef *****/

typedef unsigned char ZLongAddr_t[Z_EXTADDR_LEN];

//入网结构定义
typedef struct{
  ZLongAddr_t mac;//mac做唯一标识符
  unsigned long type;//传感器掩码
}ZB_Device_login;

//断网结构
typedef struct{
  ZLongAddr_t mac;//mac做唯一标识符
}ZB_Device_logout;//退出登录数据包

//统一串口数据包
typedef struct{
	long int      msgtype;
	int           count;
	int           cmd;
	unsigned char data[24];
}uartmsg;

//灯光数据包
typedef struct{
	ZLongAddr_t mac;//设备MAC地址 唯一标识符
	unsigned char which;//灯光ID(多灯光使用)
	unsigned char status;//状态
	unsigned char dev_response;//数据包响应号
}Light_Ctrl_pkg;

//温度数据包
typedef struct{
	ZLongAddr_t mac;//设备MAC地址 唯一标识符
	unsigned char Temp_data;//温度数据
}Temp_pkg;

//湿度数据包
typedef struct{
	ZLongAddr_t mac;//设备MAC地址 唯一标识符
	unsigned char Humidity_data;//湿度数据
}Humidity_pkg;

//光强数据包
typedef struct{
	ZLongAddr_t mac;//设备MAC地址 唯一标识符
	unsigned char Illumination_data;//光强数据
}Illumination_pkg;

//烟雾传感数据包
typedef struct{
	ZLongAddr_t mac;//设备MAC地址 唯一标识符
	unsigned char status;//状态
}Smoke_pkg;

//蜂鸣器数据包
typedef struct{
	ZLongAddr_t mac;//设备MAC地址 唯一标识符
	unsigned char status;//状态
	unsigned char dev_response;//数据包响应号
}Beep_pkg;

//风扇数据包
typedef struct{
	ZLongAddr_t mac;//设备MAC地址 唯一标识符
	unsigned char status;//状态
	unsigned char dev_response;//数据包响应号
}Fan_pkg;

//热水器数据包
typedef struct{
	ZLongAddr_t mac;//设备MAC地址 唯一标识符
	unsigned char status;//设备状态
	unsigned char dev_response;//数据包响应号
}Calorifier_pkg;

//窗帘数据包
typedef struct{
	ZLongAddr_t mac;//设备MAC地址 唯一标识符
	unsigned char status;//设备状态
	unsigned char dev_response;//数据包响应号
}Curtain_pkg;

typedef struct{
	ZLongAddr_t mac;//设备MAC地址 唯一标识符
	unsigned char status;//设备状态
	unsigned char dev_response;//数据包响应号
}Door_pkg;

typedef struct{
	long int msg_type;
	int room_id;
	int cmd_type;
}WebSocket_info_pkg;

typedef struct{
	long int msgtype;
	char name[32];
	char mac[32];
	char type;
	char status;
	char alarm_time[8];
	char alarm_repeat;
	char alarm_status;
}alarm_task_msg_pkg;

typedef struct{
    long int msgtype;
    int del_alarm_task_id;
}del_alarm_task_msg;

/**** union ****/
union semun{
	int val;
};

/***** function declaration *****/
void Msg_queue_Init();
void Msg_queue_del();
void Sem_Init();
void poperation(int index, int semid);
void voperation(int index, int semid);
void sys_error(const char *str);
void sys_error_num(const char *str, const int ret);
void str_transition_mac(const char *dev_str_mac, char *dev_mac);
void mac_transition_str(char *dev_str_mac, const char *dev_mac);
int str_to_int(const char *buf);

/***** gloabal variable *****/
extern int g_msgid;
extern int g_sem_id;

#endif
